package com.zhouxiaoxuan13.consumer.feign;

import com.zhouxiaoxuan13.consumer.dto.PromotionDetailDTO;
import com.zhouxiaoxuan13.consumer.dto.Promotion;
import com.zhouxiaoxuan13.consumer.feign.fallback.PromotionServiceFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 促销服务Feign客户端
 * 使用OpenFeign实现微服务间的接口调用
 * 集成负载均衡、熔断器和容错机制
 */
@FeignClient(
    name = "promotion-service",           // 服务名称，与Consul中注册的服务名一致
    path = "/api/promotions",            // 服务的基础路径
    fallback = PromotionServiceFallback.class,  // 降级处理类
    contextId = "promotionServiceClient"  // 唯一标识符，避免Bean冲突
)
public interface PromotionServiceClient {

    /**
     * 获取所有促销信息（包含商品详情）
     * @return 促销详情列表
     */
    @GetMapping
    ResponseEntity<List<PromotionDetailDTO>> getAllPromotions();

    /**
     * 获取当前活跃的促销信息
     * @return 活跃促销详情列表
     */
    @GetMapping("/active")
    ResponseEntity<List<PromotionDetailDTO>> getActivePromotions();

    /**
     * 获取基础促销信息（不包含商品详情）
     * @return 基础促销列表
     */
    @GetMapping("/basic")
    ResponseEntity<List<Promotion>> getBasicPromotions();

    /**
     * 根据ID获取单个促销信息
     * @param id 促销ID
     * @return 促销信息
     */
    @GetMapping("/{id}")
    ResponseEntity<Promotion> getPromotionById(@PathVariable("id") Long id);

    /**
     * 创建新的促销
     * @param promotion 促销信息
     * @return 创建的促销信息
     */
    @PostMapping
    ResponseEntity<Promotion> createPromotion(@RequestBody Promotion promotion);

    /**
     * 更新促销信息
     * @param id 促销ID
     * @param promotion 更新的促销信息
     * @return 更新后的促销信息
     */
    @PutMapping("/{id}")
    ResponseEntity<Promotion> updatePromotion(@PathVariable("id") Long id, @RequestBody Promotion promotion);

    /**
     * 删除促销
     * @param id 促销ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    ResponseEntity<Void> deletePromotion(@PathVariable("id") Long id);

    /**
     * 同步促销价格
     * @return 同步结果
     */
    @PostMapping("/actions/sync-prices")
    ResponseEntity<String> syncPromotionPrices();

    /**
     * 同步所有活跃促销
     * @return 同步结果
     */
    @PostMapping("/actions/sync-all")
    ResponseEntity<String> syncAllActivePromotions();
}
